package demo.generic;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2020/7/5-2020
 * @Description: 这里用一句话描述这个类的作用
 */
public class GenericDemo {
    public static void main(String[] args) {
//        List linkList=new LinkedList();
//        linkList.add("words");
//        linkList.add(1);
//        for (int i = 0; i < linkList.size(); i++) {
//            /**
//             * 出现 ClassCastException异常。
//             * 主要是由于int类型的1在进行强转String类型的时候出现了异常
//             */
//            String str = (String) linkList.get(i);
//            System.out.println(str);
//        }

        GenericClassExample<String> stringGenericClassExample=new GenericClassExample<>("abc");
        GenericClassExample<Integer> integerGenericClassExample=new GenericClassExample<>(123);
        System.out.println(stringGenericClassExample.getClass());
        System.out.println(integerGenericClassExample.getClass());
        System.out.println(stringGenericClassExample.getMember().getClass());
        System.out.println(integerGenericClassExample.getMember().getClass());
        System.out.println(stringGenericClassExample.doOtherThing());
        System.out.println(integerGenericClassExample.doOtherThing());

        Integer getValue = handleMember1(integerGenericClassExample);
        System.out.println("最终返回的结果是："+getValue);
    }


    /**
     * <Integer> 直接指定泛型的类型是 Integer 类型的。
     */
    public static Integer handleMember1(GenericClassExample<Integer> integerGenericClassExample){
        return 111+integerGenericClassExample.getMember();
    }

    /**
     * <?> 使用? 指定泛型的类型。？代表通配的意思。可以是任意类型。
     * 但是这样会导致泛型的类型检查失去意义。因为可以传入任何类型的。比如String，这样在方法的内部在运行的时候就有可能出现异常，比如：类型转换异常等等。
     */
    public static Integer handleMember2(GenericClassExample<?> genericClassExample){
        return 111+(Integer) genericClassExample.getMember();
    }

    /**
     * <? extends Number> 。指定泛型必须是number类型的子类。
     */
    public static Integer handleMember3(GenericClassExample<? extends Number> genericClassExample){
        return 111+(Integer) genericClassExample.getMember();
    }

    /**
     * <? super Integer> 指定泛型的子类是Integer。 因此在调用该方法的时候，可以传入Number.class类型的参数。
     */
    public static  Integer handleMember4(GenericClassExample<? super Integer> genericClassExample){
        return 111+(Integer) genericClassExample.getMember();
    }
}
